/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOKardex;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Kardex;

/**
 *
 * @author WINDOWS 7
 */
@SuppressWarnings("unchecked")
@Repository("daoKardex")
public class DAOKardexImpl extends DaoImpl<Kardex, Integer> implements IDAOKardex, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public int buscarCantidadKardex(Kardex kardex) throws DAOException {
        sessionFactory.getCurrentSession().flush();
        Long a = (Long) sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                .add(Restrictions.eq("id.idArticulo", kardex.getId().getIdArticulo()))
                .add(Restrictions.eq("id.idSede", kardex.getId().getIdSede()))
                .add(Restrictions.eq("id.partidaLote", kardex.getId().getPartidaLote()))
                //.add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                .setProjection(Projections.rowCount())
                .uniqueResult();

        return a.intValue();
        //.list().get(0);
    }
    
    @Override
    public int buscarCantidadKardexActivos(Kardex kardex) throws DAOException {
        sessionFactory.getCurrentSession().flush();
        Long a = (Long) sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                .add(Restrictions.eq("id.idArticulo", kardex.getId().getIdArticulo()))
                .add(Restrictions.eq("id.idSede", kardex.getId().getIdSede()))
                .add(Restrictions.eq("id.partidaLote", kardex.getId().getPartidaLote()))
                .add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                .setProjection(Projections.rowCount())
                .uniqueResult();

        return a.intValue();
        //.list().get(0);
    }

    @Override
    public Kardex buscarUltimoKardex(Kardex kardex) throws DAOException {
        sessionFactory.getCurrentSession().flush();
        return (Kardex) sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                .addOrder(Order.desc("id.nuSecKardex"))
                .add(Restrictions.eq("id.idArticulo", kardex.getId().getIdArticulo()))
                .add(Restrictions.eq("id.idSede", kardex.getId().getIdSede()))
                .add(Restrictions.eq("id.partidaLote", kardex.getId().getPartidaLote()))
                .add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                .setMaxResults(1)
                .uniqueResult();
    }

    @Override
    public Collection<Kardex> listaKardexPorFiltro(Kardex kardex, Date fechaInicio, Date fechaFinal) throws DAOException {
        try {
            Collection<Kardex> lista = null;
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                    .addOrder(Order.desc("id.idSede"))
                    .addOrder(Order.desc("id.idArticulo"))
                    .addOrder(Order.desc("id.partidaLote"))
                    .addOrder(Order.asc("id.nuSecKardex"))
                    .add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                    .add(Restrictions.like("id.partidaLote", "%" + kardex.getId().getPartidaLote() + "%"))
                    .add(Restrictions.eq("id.idEmpresa", kardex.getId().getIdEmpresa()))
                    .add(Restrictions.like("tiMovimiento", "%" + kardex.getTiMovimiento() + "%"));
            if (kardex.getId().getIdSede() != 0) {
                query = query.add(Restrictions.eq("id.idSede", kardex.getId().getIdSede()));
            }
            if (kardex.getId().getIdArticulo() != 0) {
                query = query.add(Restrictions.eq("id.idArticulo", kardex.getId().getIdArticulo()));
            }
            if (kardex.getIdOrdenPedido() != null) {
                query = query.add(Restrictions.eq("idOrdenPedido", kardex.getIdOrdenPedido()));
            }

            if (kardex.getIdGuiaRemision().getIdOrdenCompraServicio() != null) {
                query = query.createAlias("idGuiaRemision", "g")
                        .add(Restrictions.eq("g.idOrdenCompraServicio", kardex.getIdGuiaRemision().getIdOrdenCompraServicio()));
            }

            if (kardex.getArticulo() != null) {
                query = query.createAlias("articulo", "art");
                if (kardex.getArticulo().getIdCategoriaArticulo() != null) {
                    query = query.createAlias("art.idCategoriaArticulo", "ca")
                            .add(Restrictions.disjunction()
                            .add(Restrictions.eq("art.idCategoriaArticulo", kardex.getArticulo().getIdCategoriaArticulo()))
                            .add(Restrictions.eq("ca.idCategoriaArticulo", kardex.getArticulo().getIdCategoriaArticulo())));
                }
                if (kardex.getArticulo().getDetalle() != null) {
                    query = query.add(Restrictions.like("art.detalle", "%" + kardex.getArticulo().getDetalle() + "%"));
                }

            }

            if (fechaInicio == null && fechaFinal == null) {
                //System.out.println("entro a todos");
                lista = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                //System.out.println("entro a los dos");
                lista = query.add(Restrictions.ge("fecMovimiento", fechaInicio)).add(Restrictions.le("fecMovimiento", fechaFinal)).list();
            } else if (fechaInicio == null) {
                //System.out.println("entro a menor");
                lista = query.add(Restrictions.le("fecMovimiento", fechaFinal)).list();
            } else if (fechaFinal == null) {
                //System.out.println("entro a final");
                lista = query.add(Restrictions.ge("fecMovimiento", fechaInicio)).list();
            }

            return lista;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    @Override
    public Kardex buscarKardexSalidaMasAntiguo(Kardex kardex) throws DAOException {
        sessionFactory.getCurrentSession().flush();
        return (Kardex) sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                .addOrder(Order.asc("fecMovimiento"))
                .add(Restrictions.eq("idOrdenPedido", kardex.getIdOrdenPedido()))
                .add(Restrictions.eq("tiMovimiento", kardex.getTiMovimiento()))
                .add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                .setMaxResults(1)
                .uniqueResult();
    }

    @Override
    public Collection<Kardex> buscarKardexSalidaPorOpyCat(Kardex kardex) throws DAOException {
        sessionFactory.getCurrentSession().flush();
        return sessionFactory.getCurrentSession().createCriteria(Kardex.class)
                .createAlias("articulo.idCategoriaArticulo", "ar")
                .createAlias("ar.idCategoriaArticulo", "ca")
                .addOrder(Order.asc("fecMovimiento"))
                .add(Restrictions.eq("idOrdenPedido", kardex.getIdOrdenPedido()))
                .add(Restrictions.eq("tiMovimiento", kardex.getTiMovimiento()))
                .add(Restrictions.eq("estadoRegistro", String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor())))
                .add(Restrictions.disjunction()
                .add(Restrictions.eq("idCategoriaArticulo", kardex.getArticulo().getIdCategoriaArticulo()))
                .add(Restrictions.eq("ca.idCategoriaArticulo", kardex.getArticulo().getIdCategoriaArticulo())))
                .list();
    }
}
